#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cstring>
using namespace std;
int cnt = 0;
void handler(int sig)
{
    cout << "进程收到信号:" << sig << " cnt:" << cnt << endl;
    return;
}

static void showPending(sigset_t *pendings)
{
    for (int sig = 1; sig <= 31; sig++)
    {
        if (sigismember(pendings, sig))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

// static void Usage(const string &str)
// {
//     cerr << "Usage\n\t" << str << "signo pid" << endl;
// }

int main(int argc, char *argv[])
{
    // if (argc != 3)
    // {
    //     Usage("./mykill ");
    //     return 1;
    // }

    // if (kill(static_cast<pid_t>(atoi(argv[2])), atoi(argv[1])))
    // {
    //     cerr << "kill:" << strerror(errno) << endl;
    //     exit(2);
    // }
    // sigset_t的定义:
    // typedef struct
    // {
    //     unsigned long int __val[_SIGSET_NWORDS];
    // } __sigset_t;
    cout << "pid: " << getpid() << endl;
    sigset_t blockSig, oldBlockSig; //定义block信号集
    for (int sig = 1; sig < 31; sig++)
    {
        //将每个信号都添加屏蔽字和自定义方法
        sigaddset(&blockSig, sig);
        signal(sig, handler);
    }
    //设置用户级信号屏蔽字到内核中，让当前进程屏蔽信号（9号管理员命令除外）
    sigprocmask(SIG_SETMASK, &blockSig, &oldBlockSig);

    sigset_t pendings;
    while (1)
    {
        sigemptyset(&pendings);
        if (sigpending(&pendings) == 0) //获取pending信号集
        {
            showPending(&pendings);
        }
        sleep(1);
        cnt++;
        if (cnt == 20)
        {
            cout << "解除对所有信号的阻塞......" << endl;
            sigset_t sigs;
            sigemptyset(&sigs);
            sigaddset(&sigs, 2);                      //留个2号
            sigprocmask(SIG_UNBLOCK, &sigs, nullptr); //解除阻塞
        }
    }
    return 0;
}